package com.atguigu.headline.dao.impl;

import com.atguigu.headline.dao.BaseDao;
import com.atguigu.headline.dao.NewsHeadlineDao;
import com.atguigu.headline.pojo.NewsHeadline;
import com.atguigu.headline.pojo.vo.HeadlineDetailVo;
import com.atguigu.headline.pojo.vo.HeadlinePageVo;
import com.atguigu.headline.pojo.vo.HeadlineQueryVo;

import java.util.ArrayList;
import java.util.List;

/**
 * @ Author     ：侯耀祖
 * @ Description：
 */
public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadlineDao {
    /*
 * pageData:[
 * {
            "hid":"1",                     // 新闻id
            "title":"尚硅谷宣布 ... ...",   // 新闻标题
            "type":"1",                    // 新闻所属类别编号
            "pageViews":"40",              // 新闻浏览量
            "pastHours":"3" ,              // 发布时间已过小时数
            "publisher":"1"                // 发布用户ID
        }
 * ]
 * pageNum:1
 * pageSize:1
 * totalPage:1
 * totalNum:1
 *
 *
 *
 * {
    "keyWords":"马斯克", // 搜索标题关键字
    "type":0,           // 新闻类型
    "pageNum":1,        // 页码数
    "pageSize":"10"     // 页大小
}
 */
    @Override
    public List<HeadlinePageVo> findPageList(HeadlineQueryVo headlineQueryVo) {
        List params = new ArrayList();
        String sql = """
                select
                    hid,
                    title,
                    type,
                    page_views pageViews,
                    TIMESTAMPDIFF(HOUR,create_time,now()) pastHours,
                    publisher
                from
                    news_headline
                where
                    is_deleted = 0
                """;
        if (headlineQueryVo.getType()!=0){
            sql = sql.concat(" and type = ? ");
            params.add(headlineQueryVo.getType());
        }
        if (headlineQueryVo.getKeyWords() != null && !headlineQueryVo.getKeyWords().equals("")){
            sql = sql.concat(" and title like ? ");
            params.add("%"+headlineQueryVo.getKeyWords()+"%");
        }
        sql = sql.concat(" order by pastHours ASC , page_views DESC");
        sql = sql.concat(" limit ? , ? ");
        params.add((headlineQueryVo.getPageNum()-1) * headlineQueryVo.getPageSize());
        params.add(headlineQueryVo.getPageSize());
        return baseQuery(HeadlinePageVo.class,sql,params.toArray());
    }

    @Override
    public int findPageCount(HeadlineQueryVo headlineQueryVo) {
        List params = new ArrayList();
        String sql = """
                select
                    count(1)
                from
                    news_headline
                where
                    is_deleted = 0
                """;
        if (headlineQueryVo.getType()!=0){
            sql = sql.concat(" and type = ? ");
            params.add(headlineQueryVo.getType());
        }
        if (headlineQueryVo.getKeyWords() != null && !headlineQueryVo.getKeyWords().equals("")){
            sql = sql.concat(" and title like ? ");
            params.add("%"+headlineQueryVo.getKeyWords()+"%");
        }
        Long count = baseQueryObject(Long.class,sql,params.toArray());
        return count.intValue();
    }

    @Override
    public int incrPageViews(int hid) {
        String sql = "update news_headline set page_views = page_views + 1 where hid = ?";
        return baseUpdate(sql,hid);
    }
//     hid;
//     title;
//     article;
//     type;
//     typeName;
//     pageViews;
//     pastHours;
//     publisher;
//     author;
    @Override
    public HeadlineDetailVo findHeadlineDetail(int hid) {
        String sql = """
                select
                    h.hid hid ,
                    h.title title ,
                    h.article article ,
                    h.type type ,
                    t.tname typeName ,
                    h.page_views pageViews ,
                    TIMESTAMPDIFF(HOUR,h.create_time,now()) pastHours ,
                    h.publisher publisher ,
                    u.nick_name author
                from
                    news_headline h
                left join
                    news_type t
                on
                    h.type = t.tid
                left join
                    news_user u
                on
                    h.publisher = u.uid
                where
                    hid = ?
                """;
        List<HeadlineDetailVo> list = baseQuery(HeadlineDetailVo.class,sql,hid);
        return list != null && list.size()>0 ? list.get(0):null;
    }

    @Override
    public int addNewsHeadline(NewsHeadline newsHeadline) {
        String sql = """
                insert into news_headline
                values(DEFAULT,?,?,?,?,0,now(),now(),0)
                """;
        return baseUpdate(sql,
                newsHeadline.getTitle(),
                newsHeadline.getArticle(),
                newsHeadline.getType(),
                newsHeadline.getPublisher());
    }

    @Override
    public NewsHeadline fidByHid(Integer hid) {
        String sql = """
                select
                    hid,
                    title,
                    article,
                    type,
                    publisher,
                    page_views pageViews,
                    create_time createTime,
                    update_time updateTime,
                    is_deleted isDeleted
                from
                    news_headline
                where
                    hid = ?
                """;
        List<NewsHeadline> list = baseQuery(NewsHeadline.class,sql,hid);
        return null != list && list.size()>0?list.get(0):null;
    }

    @Override
    public int update(NewsHeadline newsHeadline) {
        String sql = """
                update
                    news_headline
                set
                    title = ?,
                    article = ?,
                    type = ?,
                    update_time = now()
                where
                    hid = ?
                """;
        return baseUpdate(sql,
                newsHeadline.getTitle(),
                newsHeadline.getArticle(),
                newsHeadline.getType(),
                newsHeadline.getHid());
    }

    @Override
    public int removeByHid(int hid) {
        String sql = "update news_headline set is_deleted = 1 where hid = ?";
        return baseUpdate(sql,hid);
    }
}
